package com.hb.config;

import com.mongodb.client.MongoClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoClientFactoryBean;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@Configuration
// 启用 Spring Data MongoDB 的 Repository 自动生成功能
@EnableMongoRepositories(basePackages = "com.hb.repository")
public class MongoDBConfig {
    /**
     * 配置 MongoClient bean
     * 用 MongoClientFactoryBean 声明了一个 MongoClient 实例。这个 bean 将 Spring Data MongoDB 与数据库本身连接了起来（与使用关系型数据时
     * DataSource 所做的事情并没有什么区别）。尽管我们可以使用 MongoClient 直接创建 MongoClient 实例，但如果这样做的话，就必须要处理 MongoClient
     * 构造器所抛出的 UnknownHostException 异常。在这里，使用 Spring Data MongoDB 的 MongoClientFactoryBean 更加简单。因为它是一个工厂 bean，
     * 因此 MongoClientFactoryBean 会负责构建 MongoClient 实例，我们不必再担心 UnknownHostException 异常。
     * @return
     */
    @Bean
    public MongoClientFactoryBean mongoClient() {
        MongoClientFactoryBean mongoClient = new MongoClientFactoryBean();
        mongoClient.setHost("localhost");
        return mongoClient;
    }

    /**
     * 配置 MongoTemplate bean
     * 即便不直接使用 MongoTemplate，我们也会需要这个 bean，因为 Repository 的自动化生成功能在底层使用了它。
     * @param mongoClient
     * @return
     */
    @Bean
    public MongoOperations mongoTemplate(MongoClient mongoClient) {
        return new MongoTemplate(mongoClient, "OrdersDB");
    }
}
